package wlxldh357;

public class J22_privateConstructor {

	// private 으로 선언된 생성자
	// 일반적으로 모든 생성자는 public 이어야함
	// 클래스에 대한 객체를 생성하려면 반드시 필요한 것이 생성자이기 때문임

	// 하지만, 어떤 생성자는 private 으로 만들어서
	// 그들의 클래스가 객체화되지 못하게 하는 경우도 있음
	// private 생성자를 사용한 클래스를 singleton 클래스라 부름
	
	//생성자는 private 으로 선언
	//객체변수는 private static 으로 선언해서 클래스의 객체를 메서드를 통해 접근 가능

	public static void main(String[] args) {
		/*
		 * Singleton one = new Singleton(); 
		 * Singleton two = new Singleton();
		 * Singleton three = new Singleton();
		 */
		Singleton one = Singleton.newInstance();
		Singleton two = Singleton.newInstance();
		Singleton three = Singleton.newInstance();

	}

}

class Singleton {
	private static Singleton object = null;
	//object 는 static 으로 선언되었기 때문에 단하나의 객체만 생성가능
	/*
	 * public Singleton() { 
	 * System.out.println("객체가 하나 만들어졌음"); //일반적인 생성자
	 */

	private Singleton() {
		System.out.println("객체가 하나 만들어졌음");

	}// 특수한 생성자

	/*public static Singleton newInstance() {
		Singleton object = new Singleton();
		return object;}*/
	// 생성자메서드는 일반메서드를 통해 호출
    public static Singleton newInstance() {
  
	if(object == null) object = new Singleton();
	//객체가 만들어지지 않았다면 (object == null)
	//객체를 하나 생성함 (new Singleton)
	return object;
    }
}